SQL Vergelijkingsoperatoren
Home

SQL Vergelijkingsoperatoren

SQL Vergelijkingsoperatoren

De vergelijkingsoperatoren zijn de zelfde als die in andere programmeertalen.

Probleem

Bij het selecteren van rijen uit een tabel moet je de mogelijkheid hebben om waarden te kunnen vergelijken: zijn ze groter of kleiner dan, of groter of gelijk aan of kleiner of gelijk aan?

Oplossing

Symbool

Beschrijving

=

Gelijk

<

Kleiner dan

>

Groter dan

<=

Kleiner dan of gelijk aan

>=

Groter dan of gelijk aan

<>

Verschillend

Enkele voorbeelden kunnen het gebruik van de vergelijksoperatoren verduidelijken.

-- JI
-- 4 december 2012
--
use A88586JefInghelbrecht;
select Familienaam, Titel from Boeken where Familienaam < 'B';

Dit SELECT statement retourneert alle rijen uit de tabel Boeken waarvan de Familienaam kolom een waarde heeft die kleiner is dan B.

Om kleiner dan te begrijpen, moet je eerst weten dat de namen in alfabetische volgorde (in het Engels collation order) worden gerangschikt. Alle namen kleiner dan 'B' wil zeggen alle alfanumerieke waarden die voor de 'B' in de alfabetische volgorde voorkomen.

Let erop dat rij met de famielenaam Beth in de selectie niet is opgenomen. Om ook die rij te selecteren, zou je kunnen denken om de expressie Familenaam <= 'B' te gebruiken:

-- JI
-- 4 december 2012
--
use A88586JefInghelbrecht;
select Familienaam, Titel from Boeken where Familienaam <= 'B';

Dat levert alleen De Stad van God van Augustinus op. De boeken van Beth worden niet getoond. Dat komt omdat we de boeken opvragen waarvan de Familienaam kleiner of gelijk is aan B. De familenaam 'Beth' is niet gelijk aan de familienaam 'B'!

Als we 'B' als familienaam toevoegen wordt die natuurlijk wel geselecteerd:

insert into Boeken (
   Familienaam,
   Titel,
   Voornaam)
values (
   'B',
   'Het Boek',
   'Jef');

select Titel, Familienaam from Boeken
   where Familienaam <= 'B';

Nu wordt 'B' wel getoond.

Stel dat je alle titels wilt van de auteurs wilt waarvan de familienaam begint met een' A' of een 'B'.

Je moet de WHERE clausule verfijnen:

-- JI
-- 4 december 2012
--
use A88586JefInghelbrecht;
select Familienaam, Titel from Boeken where Familienaam <= 'Bz';

Dit is beter:

select Familienaam, Titel from Boeken where Familienaam < 'C'

Wat gebeurt er met accenten? Zal het boek van de auteur Bréhier geselecteerd worden?

We proberen het uit:

-- kp
-- 16 april 2013
-- oef2 boek toevoegen
use A89905JefInghelbrecht;
insert into Boeken (
   Voornaam,
   Familienaam,
   Titel,
   Stad,
   Uitgeverij,
   Verschijningsdatum,
   Herdruk,
   Commentaar,
   Categorie,
   InsertedBy,
)
values
(
   'Emile',
   'Bréhier',
   'Cours de Philosophie',
   'Paris',
   'Gallimard',
   '1935',
   '1960',
   'Goed boek',
   'Filosofie',
   'JI'
);

select Voornaam, Familienaam, Titel from Boeken
   where Familienaam < 'Bz';

De naam Bréhier wordt mee geselecteerd omdat MS SQL standaard accent gevoelig is. Om de 'collation' volgorde te kennen typ je de volgende instructie:

  1. MSSQL: select serverproperty(N'collation')
  2. MSSQL: SHOW COLLATION

antwoord:

SQL_Latin1_General_CP1_CI_AS

insert into Boeken (
   Voornaam,
   Familienaam,
   Titel,
   Stad,
   Uitgeverij,
   Verschijningsjaar,
   InsertedBy)
values
  ('Céline', 'Claus', 'De verwondering', 'Antwerpen', 'Manteau', '1970', 'JI'),
   ('Celine' ,'Raes', 'Jagen en gejaagd worden', 'Antwerpen', 'De Bezige Bij', '1954', 'JI'),
   ('CELINE', 'Sarthe', 'Het zijn en het niets', 'Parijs', 'Gallimard', '1943', 'JI');

select * from Boeken where voornaam = 'Celine';

Celine en CELINE worden geretourneerd.

alter table Boeken
   alter column Voornaam nvarchar(50)
   collate Latin1_General_100_CS_AI;

Celine en Céline worden nu geretourneerd.

Stel dat je alle auteurs wilt selecteren waarvan de familienaam begint met een 'B'. Welke script moet je daarvoor schrijven?

select Titel, Familienaam from Boeken
   where (Familienaam >= 'B' and Familienaam < 'C');

Om alle boeken die in 2000 en ervoor verschenen zijn te selecteren kan het volgende statement gebruiken:

use JefInghelbrecht;
select Voornaam, Familienaam, Titel from boeken
   where Verschijningsdatum <= '2000';

Dat levert het volgende resultaat op:

Er zitten 10 boeken in de tabel die in 2000 of ervoor verschenen zijn. Om de boeken te selecteren die na 2000 verschenen zijn:

use JefInghelbrecht;
select Voornaam, Familienaam, Titel from boeken
   where Verschijningsdatum > '2000'

Je ziet dat er 19 boeken in de tabel zitten die na 2000 verschenen zijn:

Vergelijkingsoperatoren werken niet alleen op getallen. Je kan ook tekst met elkaar vergelijken. Als we alle boeken willen selecteren waarvan de familienaam van de auteur begint met een A schrijven we het volgende statement:

use JefInghelbrecht;
select Voornaam, Familienaam, Titel from boeken
   where Familienaam < 'B';

Alle rijen met Familienaam die kleiner zijn dan B worden geselecteerd. Als we Familienaam = ‘A’ gebruiken wordt een lege set geretourneerd. Dat is ook logisch want er zit geen enkel boek in de tabel waarvan de familenaam van de auteur gelijk is aan A.

Hoe selecteer je met vergelijkingsoperatoren alle boeken waarvan de familienaam van de auteur begint met een D?

use JefInghelbrecht
   select Voornaam, Familienaam, Titel from boeken
   where Familienaam >= 'D' and Familienaam < 'E';

Dat statement retourneert de volgende set:

Opmerking over NULL

Om na te gaan als een expressie NULL is, gebruik je de IS NULL of de IS NOT NULL i.p.v. de vergelijkingsoperatiren (zoals = or !=). Vergelijkingsoperatoren retourneren UNKNOWN.

select * from Boeken where Stad is null;

Let erop hoe we alledaagse manier van spreken omzetten in logische expressies. Boeken die verschenen zijn na 2000 wordt WHERE Verschijningsdatum > '2000'.

Je kan een test op een kolom uitvoeren die niet in de lijst van de geselecteerde kolommen is opgenoemen.

JI
2020-01-26 11:30:30